import { useFrame } from "@react-three/fiber";
import { useRef } from "react";

function DLight() {
  const lightRef = useRef();
  /**
   * 平行光源跟随相机，实现阴影跟随
   */
  useFrame((state, delta) => {
    const { camera } = state;
    // 平行光源跟随相机的时候，一般来说就z轴位置跟随即可，
    //+1是因为 位置应该和相机位置有一定的偏差,这样的阴影效果更好
    // -4 是因为，将光源向-z方向偏移，可以然球体身后的物体，超出阴影相机，不产生阴影，提高效率
    lightRef.current.position.z = camera.position.z + 1-4;
    lightRef.current.target.position.z = camera.position.z-4;
    // three.js只会更新在场景中可见对象的变换矩阵，
    //如相机,光源的target不能够直接可见的对象等，对他们的position，scale,roation进行改变时候，
    //需要手动更新对应的变换矩阵
    lightRef.current.target.updateMatrixWorld();
  });
  return (
    <>
      <directionalLight
        ref={lightRef}
        castShadow
        position={[4, 4, 1]}
        intensity={1.5}
        shadow-mapSize={[1024, 1024]}
        shadow-camera-near={1}
        shadow-camera-far={10}
        shadow-camera-top={10}
        shadow-camera-right={10}
        shadow-camera-bottom={-10}
        shadow-camera-left={-10}
      />
      <ambientLight intensity={0.5} />
    </>
  );
}
export default DLight;
